"""
语法：
class 父类:
    pass
class 子类(父类):
    pass
"""
# 父类：父亲
class Parent1:
    xxx = 333       # 类属性
    def run(self):      # 类方法
        print("我是父类的方法")
# 子类：儿子
class Sub1(Parent1):
    xxx = 666
    def run(self):
        print("我是子类的方法")
    pass
# 主程序入口
"""
if __name__ == '__main__':
    #通过子类实例化对象:s1
    s1 = Sub1()
    # 调用父类的类属性
    print(s1.xxx)   #子类和父类有相同的类属性，优先子类  >  父类
    # 调用父类的类方法
    s1.run()
"""
# 父类：父亲
class People:
    school = "不造啊"      # 类属性
    def __init__(self,name,age,sex):    # 实例属性
        self.name = name
        self.age = age
        self.sex = sex
# 子类：儿子
class Student(People):
    def play(self): # self表示对象本身，只要在类里面，所有的类方法都会默认携带的，也是不需要传参的
        print("%s play football"%self.name)
        print("今年：%s"%self.age)
#子类：儿子
class Teacher(People):
    def course(self):
        print("%s course"%self.name)

"""
if __name__ == '__main__':
    # 子类Student创建的对象
    s1 = Student("站桑",19,'男')
    s1.play()       #
    # 子类Teacher创建的对象
    t1 = Teacher("吱吱",95,'女')
    t1.course()
"""
# 派生自己的方法一
"""
子类重用父类的功能
在子类派生出的新方法中重用父类功能的方式一：
指名道姓地引用某一个类中的函数
"""
class People:
    school = "不造啊"
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
class Students():
    def __init__(self,name,age,sex,score=0):
        # 用这个可以减少冗余的代码
        People.__init__(self,name,age,sex)
        self.score = score
    def play(self):
        print("%s play football"%self.name)
    def get_score(self):
        print("%s %s"%(self.name,self.score))
class Teachers():
    def __init__(self,name,age,sex,hobby):
        People.__init__(self,name,age,sex)
        self.hobby = hobby
    def course(self):
        print("%s course"%self.name)
"""
if __name__ == '__main__':
    s1 = Students("刘超",96,'女',65)
    s1.play()
    s1.get_score()
    # 查看对象有哪些实例属性
    print(s1.__dict__)
"""

# 派生自己的方法二
"""
派生实例化除了父类的属性添加，还能有自己的独有属性
在子类派生出的新方法中重用父类功能的方式二：super() 必须在类中使用
super(自己的类名，自己的对象)
可以省略传值
super()
"""
# 父类：父亲
class People2:
    school = "不造呀"      # 类属性
    def __init__(self,name,age,sex):        # 实例属性
        self.name = name
        self.age = age
        self.sex = sex
#子类：儿子
class Student3(People2):        # 继承父类People2
    def __init__(self,name,age,sex,score=0):        # 实例属性
        # 使用父类的实例属性，用super()
        super().__init__(name,age,sex)
        self.score = score
    def play(self):
        print("%s play football"%self.name)
# 子类：儿子
class Teacher2(People2):
    def __init__(self,name,age,sex,hobby):
        super().__init__(name,age,sex)
        self.hobby = hobby
    def course(self):
        print("%s course"%self.name)
# 单继承背景下的属性查找
# 父类，同时也是爷爷类
class Foo(object):      # 所有的类，看似没有继承关系，实际都会默认继承object
    # xxx = 444
    pass
# 子类，同时也是父类
class Bar1(Foo):
    # xxx = 333
    pass
# 子类，同时也是孙子类
class Bar2(Bar1):
    xxx = 222
    pass
"""
if __name__ == '__main__':
    b2 = Bar2()
    print(b2.xxx)       # 
    # 优先用自己的 》 父类 》 父类的父类
"""
# 多继承背景下的属性查找
"""
在多继承背景下属性的查找优先级：
此时属性的查找优先级是：对象-》对象的类——》按照从左往右的顺序一个分支一个分支的找下去
广度优先查找，从左往右一个分支一个分支的查找，在最后一个分支才去查找顶级类
顶级类是在最后一个分支才走的
"""
class G():
    x = 'G'
    pass
class F(G):
    x = 'F'
    pass
class D(G):
    x = 'D'
    pass
class E(G):
    x = 'E'
    pass
class B(E):
    x = 'B'
    pass
class C(F):
    x = 'C'
    pass
class A(B,C,D):
    x = 'A'
    pass
# obj = A()
# print(obj.x)
# print(A.mro())      # 查看调用关系














































